package map;

import java.util.HashMap;

/**
 * @Desc:
 * @Author: yanghongjun
 * @Date: 2024/2/28
 **/
public class MapUtil {

    /**
     * 计算格子的唯一ID。
     *
     * @param x    格子的x坐标
     * @param y    格子的y坐标
     * @param maxX 地图的最大x坐标（包括负数）
     * @param maxY 地图的最大y坐标（包括负数）
     * @return 格子的唯一ID
     */
    public static long getTileId(int x, int y, int maxX, int maxY) {
        // 确保坐标在最大范围内
        if (x < -maxX || x > maxX || y < -maxY || y > maxY) {
            throw new IllegalArgumentException("Coordinate is out of bounds");
        }

        // 将x和y坐标转换为非负数
        int nonNegativeX = x + Math.abs(maxX) + 1;
        int nonNegativeY = y + Math.abs(maxY) + 1;

        // 计算唯一ID
        // 使用long类型来避免可能的整数溢出
        return ((long) nonNegativeY * (2 * Math.abs(maxX) + 2) + nonNegativeX);
    }

    public static void main(String[] args) {
        // 假设地图的最大x和y坐标
        int maxX = 400;
        int maxY = 400;
        HashMap<Long, String> areaMap = new HashMap<>();
        for (int i = -maxX; i < maxX; i++) {
            for (int j = -maxY; j < maxY; j++) {
                long areaId = getTileId(i, j, maxX, maxY);
                areaMap.put(areaId, i + "_" + j);
            }
        }
        System.out.println("逻辑点数量：" + areaMap.size());
        //System.out.println(areaMap.toString());
    }
}
